package com.zff.rental.config;

import com.zff.rental.config.interceptor.SaveUserContextInterceptor;
import com.zff.rental.config.interceptor.TokenInterceptor;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;

/**
 * @author HCY
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
    /**
     * 跨域配置
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 允许的路径，即我们那些接口可以跨域
        registry.addMapping("/**")
                // 开放哪些ip、端口、域名的访问权限
                .allowedOrigins("*")
                // 开放哪些Http方法，允许跨域访问
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                // 允许HTTP请求中的携带哪些Header信息
                .allowedHeaders("*")
                // 暴露哪些头部信息（因为跨域访问默认不能获取全部头部信息）
                .exposedHeaders("*")
                //是否允许发送Cookie信息
                .allowCredentials(false)
                // 预检请求有效期
                .maxAge(3600 * 24);
    }

    @Resource
    private TokenInterceptor tokenInterceptor;

    /**
     * 添加拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 保存用户上下文拦截器
        registry.addInterceptor(new SaveUserContextInterceptor());

        // 记录请求开始时间，用于接口耗时统计
        registry.addInterceptor(new ResultTimingAdvice.ResponseTimeInterceptor());


        final ArrayList<String> pathPatterns = new ArrayList<>();
        final ArrayList<String> excludePathPatterns = new ArrayList<>();

        // 用户
        pathPatterns.add("/user/*");
        excludePathPatterns.add("/user/login");

        // 公寓
        pathPatterns.add("/apartmentManage/*");

        // 设备
        pathPatterns.add("/deviceManage/*");

        // 腾讯COS
        pathPatterns.add("/cos/*");

        // Token 校验拦截器
        registry.addInterceptor(tokenInterceptor)
                .addPathPatterns(pathPatterns)
                .excludePathPatterns(excludePathPatterns);
    }
}
